#define _GNU_SOURCE
#include "daemon_runner.h"
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include "daemon_sub_process.h"
#define SUB_PROCESS_COUNT 2
static int is_running = 1;
static sub_process_t *sub_process_list[SUB_PROCESS_COUNT];

void daemon_runner_stop(int sig)
{
    is_running = 0;
}

/**
 * 守护进程运行
 *
 * 1 守护模式（后台运行）
 * 2 把日志信息重定向到文件中
 * 3 注册信号  中断信号 终止信号
 * 4 初始化子进程 多个
 * 5 循环检测、 启动子进程
 * 6 逐个销毁子进程
 */
int daemon_runner_run()
{
    //  *
    //  * 1 守护模式（后台运行）
    daemon(0, 1); // 后台静默启动不阻塞控制台
    //  * 2 把日志信息重定向到文件中
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    open("/root/gateway.log", O_CREAT | O_RDWR | O_APPEND, 0666);
    open("/root/gateway.err", O_CREAT | O_RDWR | O_APPEND, 0666);


    //  * 3 注册信号  中断信号 终止信号当进程收到 SIGTERM（终止信号，如通过 kill <PID> 发送）时，不再执行默认的终止动作，而是调用自定义函数 daemon_runner_stop
    signal(SIGTERM, daemon_runner_stop);

    //  * 4 初始化子进程 多个
    sub_process_list[0] = daemon_sub_process_init("app");
    sub_process_list[1] = daemon_sub_process_init("ota");

    //  * 5 循环检测、 启动子进程
    while (is_running)
    {
        for (size_t i = 0; i < SUB_PROCESS_COUNT; i++)
        {
            daemon_sub_process_check_and_start(sub_process_list[i]);
        }
        sleep(2);
    }

    //  * 6 逐个销毁子进程
    for (size_t i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        daemon_sub_process_destroy(sub_process_list[i]);
    }
    return 0;
}